package co.edu.usbcali.sgi.presentation.backEndBeans;

import java.util.ArrayList;
import java.util.List;
import java.util.TimeZone;

import javax.faces.event.ValueChangeEvent;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;

import co.edu.usbcali.sgi.exceptions.ZMessManager;
import co.edu.usbcali.sgi.modelo.Estado;
import co.edu.usbcali.sgi.modelo.Persona;
import co.edu.usbcali.sgi.modelo.TipoDocumento;
import co.edu.usbcali.sgi.modelo.dto.PersonaDTO;

import co.edu.usbcali.sgi.presentation.businessDelegate.BusinessDelegatorView;
import co.edu.usbcali.sgi.utilities.DataPage;
import co.edu.usbcali.sgi.utilities.DataSource;
import co.edu.usbcali.sgi.utilities.Email;
import co.edu.usbcali.sgi.utilities.FacesUtils;
import co.edu.usbcali.sgi.utilities.PagedListDataModel;
import co.edu.usbcali.sgi.utilities.Utilities;

import com.icesoft.faces.async.render.RenderManager;
import com.icesoft.faces.async.render.Renderable;
import com.icesoft.faces.component.ext.HtmlCommandButton;
import com.icesoft.faces.component.ext.HtmlInputText;
import com.icesoft.faces.component.ext.HtmlSelectOneMenu;
import com.icesoft.faces.context.DisposableBean;
import com.icesoft.faces.webapp.xmlhttp.FatalRenderingException;
import com.icesoft.faces.webapp.xmlhttp.PersistentFacesState;
import com.icesoft.faces.webapp.xmlhttp.RenderingException;
import com.icesoft.faces.webapp.xmlhttp.TransientRenderingException;

public class ArrendatarioView extends DataSource implements Renderable,
DisposableBean{

	private HtmlInputText txtPerCelular;
	private HtmlInputText txtPerCorreo;
	private HtmlInputText txtPerPrimerApellido;
	private HtmlInputText txtPerPrimerNombre;
	private HtmlInputText txtPerSegundoApellido;
	private HtmlInputText txtPerSegundoNombre;
	private HtmlInputText txtPerTelefono;
	private List<SelectItem> listTipoDocumento = new ArrayList<SelectItem>();
	private HtmlSelectOneMenu cmbTipoDocumento;
	private HtmlInputText txtPerCedula;
	private HtmlCommandButton btnSave;
	private HtmlCommandButton btnModify;
	private HtmlCommandButton btnDelete;
	private HtmlCommandButton btnClear;
	private boolean renderDataTable;
	private boolean flag = true;
	private RenderManager renderManager;
	private PersistentFacesState state = PersistentFacesState.getInstance();
	private List<Persona> persona;
	private List<PersonaDTO> personaDTO;
	private HtmlSelectOneMenu cmbEstCodigo_Estado;

	public ArrendatarioView() {
		super("");
	}

	public List<SelectItem> getListTipoDocumento() {
		return listTipoDocumento;
	}

	private List<SelectItem> listEstado = new ArrayList<SelectItem>();



	public List<SelectItem> getListEstado() {
		return listEstado;
	}

	public void setListEstado(List<SelectItem> listEstado) {
		this.listEstado = listEstado;
	}

	public HtmlSelectOneMenu getCmbEstCodigo_Estado() {
		try {
			List<Estado> list = BusinessDelegatorView.findByCriteriaInEstado(
					null, null, null);
			listEstado.clear();
			listEstado.add(new SelectItem(0, " Seleccione el Estado.. "));

			for (Estado estado : list) {
				listEstado.add(new SelectItem(estado.getEstCod(), estado
						.getEstNombre()));
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return cmbEstCodigo_Estado;
	}

	public void setCmbEstCodigo_Estado(HtmlSelectOneMenu cmbEstCodigoEstado) {
		cmbEstCodigo_Estado = cmbEstCodigoEstado;
	}

	public void setListTipoDocumento(List<SelectItem> listTipoDocumento) {
		this.listTipoDocumento = listTipoDocumento;
	}

	public HtmlSelectOneMenu getCmbTipoDocumento() {
		try {
			List<TipoDocumento> list = BusinessDelegatorView
			.findByCriteriaInTipoDocumento(null, null, null);
			listTipoDocumento.clear();
			listTipoDocumento
			.add(new SelectItem(0, " Seleccione Tipo Documento.. "));

			for (TipoDocumento tipoDocumento : list) {
				listTipoDocumento.add(new SelectItem(tipoDocumento
						.getTdocCod(), tipoDocumento.getTdocNombre()));
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return cmbTipoDocumento;
	}

	public void setCmbTipoDocumento(HtmlSelectOneMenu cmbTipoDocumento) {
		this.cmbTipoDocumento = cmbTipoDocumento;
	}

	public String action_clear() {
		txtPerCelular.setValue(null);
		txtPerCelular.setDisabled(true);
		txtPerCorreo.setValue(null);
		txtPerCorreo.setDisabled(true);
		txtPerPrimerApellido.setValue(null);
		txtPerPrimerApellido.setDisabled(true);
		txtPerPrimerNombre.setValue(null);
		txtPerPrimerNombre.setDisabled(true);
		txtPerSegundoApellido.setValue(null);
		txtPerSegundoApellido.setDisabled(true);
		txtPerSegundoNombre.setValue(null);
		txtPerSegundoNombre.setDisabled(true);
		txtPerTelefono.setValue(null);
		txtPerTelefono.setDisabled(true);
		cmbTipoDocumento.setValue(null);
		cmbTipoDocumento.setDisabled(true);
		txtPerCedula.setValue(null);
		txtPerCedula.setDisabled(false);
		btnSave.setDisabled(true);
		btnDelete.setDisabled(true);
		btnModify.setDisabled(true);
		btnClear.setDisabled(false);

		return "";
	}

	public void listener_txtId(ValueChangeEvent event) {
		if ((event.getNewValue() != null) && !event.getNewValue().equals("")) {
			Persona entity = null;

			try {
				String perCedula = new String(txtPerCedula.getValue().toString());
				entity = BusinessDelegatorView.getPersona(perCedula);
			} catch (Exception e) {
				// TODO: handle exception
			}

			if (entity == null) {
				txtPerCelular.setDisabled(false);
				txtPerCorreo.setDisabled(false);
				txtPerPrimerApellido.setDisabled(false);
				txtPerPrimerNombre.setDisabled(false);
				txtPerSegundoApellido.setDisabled(false);
				txtPerSegundoNombre.setDisabled(false);
				txtPerTelefono.setDisabled(false);
				cmbTipoDocumento.setDisabled(false);
				txtPerCedula.setDisabled(false);
				btnSave.setDisabled(false);
				btnDelete.setDisabled(true);
				btnModify.setDisabled(true);
				btnClear.setDisabled(false);
			} else {
				txtPerCelular.setValue(entity.getPerCelular());
				txtPerCelular.setDisabled(false);
				txtPerCorreo.setValue(entity.getPerCorreo());
				txtPerCorreo.setDisabled(false);
				txtPerPrimerApellido.setValue(entity.getPerPrimerApellido());
				txtPerPrimerApellido.setDisabled(false);
				txtPerPrimerNombre.setValue(entity.getPerPrimerNombre());
				txtPerPrimerNombre.setDisabled(false);
				txtPerSegundoApellido.setValue(entity.getPerSegundoApellido());
				txtPerSegundoApellido.setDisabled(false);
				txtPerSegundoNombre.setValue(entity.getPerSegundoNombre());
				txtPerSegundoNombre.setDisabled(false);
				txtPerTelefono.setValue(entity.getPerTelefono());
				txtPerTelefono.setDisabled(false);
				cmbTipoDocumento.setValue(entity.getTipoDocumento()
						.getTdocCod());
				cmbTipoDocumento.setDisabled(false);
				txtPerCedula.setValue(entity.getPerCedula());
				txtPerCedula.setDisabled(true);
				btnSave.setDisabled(true);
				btnDelete.setDisabled(false);
				btnModify.setDisabled(false);
				btnClear.setDisabled(false);
			}
		}
	}

	public String action_save() {
		try {


			String cedula = txtPerCedula.getValue().toString();
			String celular = txtPerCelular.getValue().toString();
			String correo = txtPerCorreo.getValue().toString();
			String primerApelli = txtPerPrimerApellido.getValue().toString().toUpperCase();
			String primerNom = txtPerPrimerNombre.getValue().toString().toUpperCase();
			String segundoApelli = txtPerSegundoApellido.getValue().toString().toUpperCase();
			String segundoNom = txtPerSegundoNombre.getValue().toString().toUpperCase();
			String telefono = txtPerTelefono.getValue().toString();
			String tipoDoc = cmbTipoDocumento.getValue().toString();
			//String estado = "ACTIVO";


//			if(estado.trim().equals("")){
//				throw new Exception("Debe elegir algun estado");
//			}
			if (tipoDoc.trim().equals("")) {
				throw new Exception("Debe elejir alguna opcion");
			}

			if (!Utilities.soloLetras(primerNom)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if (primerNom.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}

			if (primerApelli.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if (!Utilities.soloLetras(primerApelli)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if (!Utilities.soloLetras(segundoApelli)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if(segundoApelli.trim().equals("")){
				throw new Exception("Este campo es obligatorio");
			}
			if (telefono.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if (!Utilities.soloNumeros(telefono)) {
				throw new Exception("Telefono debe contener solo numeros");
			}

			if (!Utilities.soloNumeros(cedula)) {
				throw new Exception("La cedula debe contener solo numeros");
			}
			if(correo.trim().equals("")){
				throw new Exception("Este campo es obligatorio");
			}
			if (cedula.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if(celular.trim().equals("")){
				throw new Exception("Este campo debe ser olbigatorio");
			}

			if (!Utilities.soloNumeros(celular)) {
				throw new Exception("Celular debe contener solo numeros");
			}
			if (!Utilities.correElectronico(correo)) {
				throw new Exception("Verifique el email");
			}

			BusinessDelegatorView.savePersona(cedula, celular, correo, primerApelli, primerNom, segundoApelli, segundoNom, telefono, "ACTIVO", tipoDoc);

			BusinessDelegatorView.saveUsuario(cedula, "ACTIVO", cedula, "4");

			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED);
			Email email = new Email();
			email.enviar(correo, "Su Login es: "+cedula+"  Password es: " +cedula );
			action_clear();



		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_delete() {
		try {
			BusinessDelegatorView.deletePersona(FacesUtils.checkString(
					txtPerCedula));
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}
	
	public String action_inactivar() {
		try {

			//			String admCodigo = txtAdmCod.getValue().toString();
			//String estado = "INACTIVO";
			String cedula = txtPerCedula.getValue().toString();
			String celular = txtPerCelular.getValue().toString();
			String correo = txtPerCorreo.getValue().toString();
			String primerApelli = txtPerPrimerApellido.getValue().toString().toUpperCase();
			String primerNom = txtPerPrimerNombre.getValue().toString().toUpperCase();
			String segundoApelli = txtPerSegundoApellido.getValue().toString().toUpperCase();
			String segundoNom = txtPerSegundoNombre.getValue().toString().toUpperCase();
			String telefono = txtPerTelefono.getValue().toString();
			String tipoDoc = cmbTipoDocumento.getValue().toString();

			//			if (!Utilities.soloNumerosyLetras(admCodigo)) {
			//				throw new Exception(
			//				"El codigo del  administrador no debe contener caracteres especiales");
			//			}
			//			if (admCodigo.trim().equals("")) {
			//				throw new Exception("Este campo es obligatorio ");
			//			}
			if (tipoDoc.trim().equals("")) {
				throw new Exception("Debe elejir alguna opcion");
			}

//			if (estado.trim().equals("")) {
//				throw new Exception("Este campo es obligatorio");
//			}

			if (!Utilities.soloLetras(primerNom)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if (primerNom.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}

			if (primerApelli.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if (!Utilities.soloLetras(primerApelli)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if (!Utilities.soloLetras(segundoApelli)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if(segundoApelli.trim().equals("")){
				throw new Exception("Este campo es obligatorio");
			}
			if (telefono.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if (!Utilities.soloNumeros(telefono)) {
				throw new Exception("Telefono debe contener solo numeros");
			}

			if (!Utilities.soloNumeros(cedula)) {
				throw new Exception("La cedula debe contener solo numeros");
			}
			if(correo.trim().equals("")){
				throw new Exception("Este campo es obligatorio");
			}
			if (cedula.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if(celular.trim().equals("")){
				throw new Exception("Este campo debe ser olbigatorio");
			}

			if (!Utilities.soloNumeros(celular)) {
				throw new Exception("Celular debe contener solo numeros");
			}
			if (!Utilities.correElectronico(correo)) {
				throw new Exception("Verifique el email");
			}
			BusinessDelegatorView.updatePersona(cedula, celular, correo, primerApelli, primerNom, segundoApelli, segundoNom, telefono, tipoDoc, "INACTIVO");
			
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modify() {
		try {
			String cedula = txtPerCedula.getValue().toString();
			String celular = txtPerCelular.getValue().toString();
			String correo = txtPerCorreo.getValue().toString();
			String primerApelli = txtPerPrimerApellido.getValue().toString().toUpperCase();
			String primerNom = txtPerPrimerNombre.getValue().toString().toUpperCase();
			String segundoApelli = txtPerSegundoApellido.getValue().toString().toUpperCase();
			String segundoNom = txtPerSegundoNombre.getValue().toString().toUpperCase();
			String telefono = txtPerTelefono.getValue().toString();
			String tipoDoc = cmbTipoDocumento.getValue().toString();
			//String estado = //;

//			if(estado.trim().equals("")){
//				throw new Exception("Debe elegir algun estado");
//			}


			if (tipoDoc.trim().equals("")) {
				throw new Exception("Debe elejir alguna opcion");
			}

			if (!Utilities.soloLetras(primerNom)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if (primerNom.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}

			if (primerApelli.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if (!Utilities.soloLetras(primerApelli)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if (!Utilities.soloLetras(segundoApelli)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if(segundoApelli.trim().equals("")){
				throw new Exception("Este campo es obligatorio");
			}
			if (telefono.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if (!Utilities.soloNumeros(telefono)) {
				throw new Exception("Telefono debe contener solo numeros");
			}

			if (!Utilities.soloNumeros(cedula)) {
				throw new Exception("La cedula debe contener solo numeros");
			}
			if(correo.trim().equals("")){
				throw new Exception("Este campo es obligatorio");
			}
			if (cedula.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if(celular.trim().equals("")){
				throw new Exception("Este campo debe ser olbigatorio");
			}

			if (!Utilities.soloNumeros(celular)) {
				throw new Exception("Celular debe contener solo numeros");
			}
			if (!Utilities.correElectronico(correo)) {
				throw new Exception("Verifique el email");
			}

			BusinessDelegatorView.updatePersona(cedula, celular, "ACTIVO",correo, primerApelli, primerNom, segundoApelli, segundoNom, telefono, tipoDoc);

			BusinessDelegatorView.updateUsuario( "ACTIVO",cedula, cedula, "1");
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modifyWitDTO(String perCedula, String perCelular,String estado,
			String perCorreo, String perPrimerApellido, String perPrimerNombre,
			String perSegundoApellido, String perSegundoNombre, String perTelefono,
			String tdocCod_TipoDocumento) throws Exception {
		try {
			BusinessDelegatorView.updatePersona(perCedula, perCelular,estado,
					perCorreo, perPrimerApellido, perPrimerNombre,
					perSegundoApellido, perSegundoNombre, perTelefono,
					tdocCod_TipoDocumento);
			renderManager.getOnDemandRenderer("PersonaView").requestRender();
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
		} catch (Exception e) {
			//renderManager.getOnDemandRenderer("PersonaView").requestRender();
			FacesUtils.addErrorMessage(e.getMessage());
			throw e;
		}

		return "";
	}

	public List<Persona> getPersona() {
		if (flag) {
			try {
				persona = BusinessDelegatorView.getPersona();
				flag = false;
			} catch (Exception e) {
				flag = true;
				FacesUtils.addErrorMessage(e.getMessage());
			}
		}

		return persona;
	}

	public boolean isFlag() {
		return flag;
	}

	public void setPersona(List<Persona> persona) {
		this.persona = persona;
	}

	public boolean isRenderDataTable() {
		try {
			if (flag) {
				if (BusinessDelegatorView.findTotalNumberPersona() > 0) {
					renderDataTable = true;
				} else {
					renderDataTable = false;
				}
			}

			flag = false;
		} catch (Exception e) {
			renderDataTable = false;
			e.printStackTrace();
		}

		return renderDataTable;
	}

	public DataModel getData() {
		state = PersistentFacesState.getInstance();

		if (onePageDataModel == null) {
			onePageDataModel = new LocalDataModel(pageSize);
		}

		return onePageDataModel;
	}

	/**
	 * This is where the Object data is retrieved from the database and
	 * returned as a list of objects for display in the UI.
	 */
	private DataPage<Persona> getDataPage(int startRow, int pageSize) {
		// Retrieve the total number of objects from the database.  This
		// number is required by the DataPage object so the paginator will know
		// the relative location of the page data.
		int totalNumberPersona = 0;

		try {
			totalNumberPersona = BusinessDelegatorView.findTotalNumberPersona()
			.intValue();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		// Calculate indices to be displayed in the ui.
		int endIndex = startRow + pageSize;

		if (endIndex > totalNumberPersona) {
			endIndex = totalNumberPersona;
		}

		try {
			persona = BusinessDelegatorView.findPagePersona(sortColumnName,
					sortAscending, startRow, endIndex - startRow);

			// Remove this Renderable from the existing render groups.
			//leaveRenderGroups();        			
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		// Add this Renderable to the new render groups.
		//joinRenderGroups();
		// Reset the dirtyData flag.
		onePageDataModel.setDirtyData(false);
		// This is required when using Hibernate.  If the SessionManager is not
		// cleared or closed objects are cached and stale objects will show up
		// in the table.
		// This way, the detached objects are reread from the database.
		// This call is not required with Hibernate, which uses a Query Hint
		// to clear the l2 cache in the DAO.
		flag = true;

		return new DataPage<Persona>(totalNumberPersona, startRow, persona);
	}

	public DataModel getDataDTO() {
		state = PersistentFacesState.getInstance();

		if (onePageDataModel == null) {
			onePageDataModel = new LocalDataModelDTO(pageSize);
		}

		return onePageDataModel;
	}

	/**
	 * This is where the Object data is retrieved from the database and
	 * returned as a list of objects for display in the UI.
	 */
	private DataPage<PersonaDTO> getDataPageDTO(int startRow, int pageSize) {
		// Retrieve the total number of objects from the database.  This
		// number is required by the DataPage object so the paginator will know
		// the relative location of the page data.
		int totalNumberPersona = 0;

		try {
			totalNumberPersona = BusinessDelegatorView.findTotalNumberPersona()
			.intValue();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		// Calculate indices to be displayed in the ui.
		int endIndex = startRow + pageSize;

		if (endIndex > totalNumberPersona) {
			endIndex = totalNumberPersona;
		}

		try {
			persona = BusinessDelegatorView.findPagePersona(sortColumnName,
					sortAscending, startRow, endIndex - startRow);

			if (Utilities.validationsList(persona)) {
				personaDTO = new ArrayList<PersonaDTO>();

				for (Persona personaTmp : persona) {
					PersonaDTO personaDTO2 = new PersonaDTO();
					personaDTO2.setPerCedula(personaTmp.getPerCedula().toString());
					personaDTO2.setPerCelular((personaTmp.getPerCelular() != null)
							? personaTmp.getPerCelular().toString() : null);
					personaDTO2.setPerCorreo((personaTmp.getPerCorreo() != null)
							? personaTmp.getPerCorreo().toString() : null);
					personaDTO2.setPerPrimerApellido((personaTmp.getPerPrimerApellido() != null)
							? personaTmp.getPerPrimerApellido().toString() : null);
					personaDTO2.setPerPrimerNombre((personaTmp.getPerPrimerNombre() != null)
							? personaTmp.getPerPrimerNombre().toString() : null);
					personaDTO2.setPerSegundoApellido((personaTmp.getPerSegundoApellido() != null)
							? personaTmp.getPerSegundoApellido().toString() : null);
					personaDTO2.setPerSegundoNombre((personaTmp.getPerSegundoNombre() != null)
							? personaTmp.getPerSegundoNombre().toString() : null);
					personaDTO2.setPerTelefono((personaTmp.getPerTelefono() != null)
							? personaTmp.getPerTelefono().toString() : null);
					personaDTO2.setTdocCod_TipoDocumento((personaTmp.getTipoDocumento()
							.getTdocCod() != null)
							? personaTmp.getTipoDocumento().getTdocCod().toString()
									: null);
					personaDTO2.setPersona(personaTmp);
					personaDTO2.setArrendatario(this);
					personaDTO.add(personaDTO2);
				}
			}

			// Remove this Renderable from the existing render groups.
			leaveRenderGroups();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		// Add this Renderable to the new render groups.
		joinRenderGroups();
		// Reset the dirtyData flag.
		onePageDataModel.setDirtyData(false);
		// This is required when using Hibernate.  If the SessionManager is not
		// cleared or closed objects are cached and stale objects will show up
		// in the table.
		// This way, the detached objects are reread from the database.
		// This call is not required with Hibernate, which uses a Query Hint
		// to clear the l2 cache in the DAO.
		flag = true;

		return new DataPage<PersonaDTO>(totalNumberPersona, startRow, personaDTO);
	}

	protected boolean isDefaultAscending(String sortColumn) {
		return true;
	}

	/**
	 * This method is called when a render call is made from the server. Render
	 * calls are only made to views containing an updated record. The data is
	 * marked as dirty to trigger a fetch of the updated record from the
	 * database before rendering takes place.
	 */
	public PersistentFacesState getState() {
		onePageDataModel.setDirtyData();

		return state;
	}

	/**
	 * This method is called from faces-config.xml with each new session.
	 */
	public void setRenderManager(RenderManager renderManager) {
		this.renderManager = renderManager;
	}

	public void renderingException(RenderingException arg0) {
		if (arg0 instanceof TransientRenderingException) {
		} else if (arg0 instanceof FatalRenderingException) {
			// Remove from existing Customer render groups.
			leaveRenderGroups();
		}
	}

	/**
	 * Remove this Renderable from existing uiCustomerBeans render groups.
	 * OnDemandRenderers are named/created using the underlying Customer Number.
	 */
	private void leaveRenderGroups() {
		if (Utilities.validationsList(personaDTO)) {
			for (PersonaDTO personaTmp : personaDTO) {
				renderManager.getOnDemandRenderer("PersonaView").remove(this);
			}
		}
	}

	/**
	 * Add this Renderable to the new uiCustomerBeans render groups.
	 * OnDemandRenderers are named/created using the underlying Customer Number.
	 */
	private void joinRenderGroups() {
		if (Utilities.validationsList(personaDTO)) {
			for (PersonaDTO personaTmp : personaDTO) {
				renderManager.getOnDemandRenderer("PersonaView").add(this);
			}
		}
	}

	public void dispose() throws Exception {
	}

	public RenderManager getRenderManager() {
		return renderManager;
	}

	public void setState(PersistentFacesState state) {
		this.state = state;
	}

	public HtmlInputText getTxtPerCelular() {
		return txtPerCelular;
	}

	public void setTxtPerCelular(HtmlInputText txtPerCelular) {
		this.txtPerCelular = txtPerCelular;
	}

	public HtmlInputText getTxtPerCorreo() {
		return txtPerCorreo;
	}

	public void setTxtPerCorreo(HtmlInputText txtPerCorreo) {
		this.txtPerCorreo = txtPerCorreo;
	}

	public HtmlInputText getTxtPerPrimerApellido() {
		return txtPerPrimerApellido;
	}

	public void setTxtPerPrimerApellido(HtmlInputText txtPerPrimerApellido) {
		this.txtPerPrimerApellido = txtPerPrimerApellido;
	}

	public HtmlInputText getTxtPerPrimerNombre() {
		return txtPerPrimerNombre;
	}

	public void setTxtPerPrimerNombre(HtmlInputText txtPerPrimerNombre) {
		this.txtPerPrimerNombre = txtPerPrimerNombre;
	}

	public HtmlInputText getTxtPerSegundoApellido() {
		return txtPerSegundoApellido;
	}

	public void setTxtPerSegundoApellido(HtmlInputText txtPerSegundoApellido) {
		this.txtPerSegundoApellido = txtPerSegundoApellido;
	}

	public HtmlInputText getTxtPerSegundoNombre() {
		return txtPerSegundoNombre;
	}

	public void setTxtPerSegundoNombre(HtmlInputText txtPerSegundoNombre) {
		this.txtPerSegundoNombre = txtPerSegundoNombre;
	}

	public HtmlInputText getTxtPerTelefono() {
		return txtPerTelefono;
	}

	public void setTxtPerTelefono(HtmlInputText txtPerTelefono) {
		this.txtPerTelefono = txtPerTelefono;
	}



	public HtmlInputText getTxtPerCedula() {
		return txtPerCedula;
	}

	public void setTxtPerCedula(HtmlInputText txtPerCedula) {
		this.txtPerCedula = txtPerCedula;
	}

	public HtmlCommandButton getBtnSave() {
		return btnSave;
	}

	public void setBtnSave(HtmlCommandButton btnSave) {
		this.btnSave = btnSave;
	}

	public HtmlCommandButton getBtnModify() {
		return btnModify;
	}

	public void setBtnModify(HtmlCommandButton btnModify) {
		this.btnModify = btnModify;
	}

	public HtmlCommandButton getBtnDelete() {
		return btnDelete;
	}

	public void setBtnDelete(HtmlCommandButton btnDelete) {
		this.btnDelete = btnDelete;
	}

	public HtmlCommandButton getBtnClear() {
		return btnClear;
	}

	public void setBtnClear(HtmlCommandButton btnClear) {
		this.btnClear = btnClear;
	}

	public void setRenderDataTable(boolean renderDataTable) {
		this.renderDataTable = renderDataTable;
	}

	public void setFlag(boolean flag) {
		this.flag = flag;
	}

	public List<PersonaDTO> getPersonaDTO() {
		return personaDTO;
	}

	public void setPersonaDTO(List<PersonaDTO> personaDTO) {
		this.personaDTO = personaDTO;
	}

	public TimeZone getTimeZone() {
		return java.util.TimeZone.getDefault();
	}

	/**
	 * A special type of JSF DataModel to allow a datatable and datapaginator
	 * to page through a large set of data without having to hold the entire
	 * set of data in memory at once.
	 * Any time a managed bean wants to avoid holding an entire dataset,
	 * the managed bean declares this inner class which extends PagedListDataModel
	 * and implements the fetchData method. fetchData is called
	 * as needed when the table requires data that isn't available in the
	 * current data page held by this object.
	 * This requires the managed bean (and in general the business
	 * method that the managed bean uses) to provide the data wrapped in
	 * a DataPage object that provides info on the full size of the dataset.
	 */
	private class LocalDataModel extends PagedListDataModel {
		public LocalDataModel(int pageSize) {
			super(pageSize);
		}

		public DataPage<Persona> fetchPage(int startRow, int pageSize) {
			// call enclosing managed bean method to fetch the data
			return getDataPage(startRow, pageSize);
		}
	}

	private class LocalDataModelDTO extends PagedListDataModel {
		public LocalDataModelDTO(int pageSize) {
			super(pageSize);
		}

		public DataPage<PersonaDTO> fetchPage(int startRow, int pageSize) {
			// call enclosing managed bean method to fetch the data
			return getDataPageDTO(startRow, pageSize);
		}
	}


}
